package com.kx.user.service.impl;

import com.kx.base.util.PatternUtil;
import com.kx.base.util.PropertiesUtil;
import com.kx.base.vo.UserVO;
import com.kx.user.dto.SignUpDTO;
import com.kx.user.mapper.UserDao;
import com.kx.user.mapper.UserMapper;
import com.kx.user.pojo.User;
import com.kx.user.pojo.UserExample;
import com.kx.user.service.UserService;
import com.kx.user.settings.Settings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @Author Sun
 * @Date 2021/7/16 17:41
 */
@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;

    @Resource
    private UserDao userDao;

    @Autowired
    private Settings settings;

    /**
     * 根据登陆名判断用户是否已经被锁定
     * 登录名可以是 手机号、邮箱、用户名
     *
     * @param signName 登录名
     * @return
     */
    @Override
    public User isLocked(String signName) {
        UserExample example = new UserExample();
        //创建一个标准
        UserExample.Criteria criteria = example.createCriteria();
        boolean isMobile = PatternUtil.isMobile(signName);
        boolean isEmail = PatternUtil.isEmail(signName);
        if (isMobile) {
            //是手机号
            criteria.andTelephoneEqualTo(signName);
        } else if (isEmail) {
            //是邮箱
            criteria.andEmailEqualTo(signName);
        } else {
            //是用户名
            criteria.andUsernameEqualTo(signName);
        }
        //根据上面设置的条件进行查询
        List<User> users = userMapper.selectByExample(example);
        if (users != null && users.size() > 0) {
            //拿到用户
            User user = users.get(0);
            //获取锁定时间
            Date lockedTime = user.getLockedTime();
            if (lockedTime != null) {
                String dbTime = new SimpleDateFormat("yyyyMMdd").format(lockedTime);
                String nowTime = new SimpleDateFormat("yyyyMMdd").format(new Date());
                if (!nowTime.equals(dbTime)) {
                    //说明是不是今天，应该解锁,重置尝试次数
                    user.setIsLocked(0);
                    user.setTryCount(0);
                }
                //根据user实体类的主键更新数据库
                userMapper.updateByPrimaryKey(user);
            } else {
                user.setIsLocked(0);
                user.setTryCount(0);
                //根据user实体类的主键更新数据库
                userMapper.updateByPrimaryKey(user);
            }
            return user;
        }
        return null;
    }

    /**
     * 根据登录名判断用户是否登录成功
     * 登录名可以为 手机号、邮箱、用户名
     *
     * @param signName 登录名
     * @param password 密码
     * @return
     */
    @Override
    public User signIn(String signName, String password) {
        User user = isLocked(signName);
        if (user == null) {
            //登录名不存在
            return null;
        }
        if (user.getIsLocked() == 1) {
            //账户被锁定
            return null;
        }
        if (user.getPassword().equals(password)) {
            //密码正确
            return user;
        } else {
            //密码错误
            String dbTime = new SimpleDateFormat("yyyyMMdd").format(user.getLockedTime());
            String nowTime = new SimpleDateFormat("yyyyMMdd").format(new Date());
            if (dbTime.equals(nowTime)) {
                //增加尝试次数
                user.setTryCount(user.getTryCount() + 1);
                String count = settings.get("user_signin_error_count");
                if (user.getTryCount().equals(count)) {
                    //设置用户状态为锁定状态
                    user.setIsLocked(1);
                }
            } else {
                //锁定时间不是今天,第一次被锁定
                user.setTryCount(1);
                user.setLockedTime(new Date());
            }
            //更新数据库信息
        }
        return null;
    }

    @Override
    public int signUp(SignUpDTO signUpDTO) {
        User user = new User();
        PropertiesUtil.copy(signUpDTO, user);
        //手机号是否存在？
        UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        criteria.andTelephoneEqualTo(signUpDTO.getTelephone());
        List<User> users = userMapper.selectByExample(example);
        if (users != null && users.size() > 0) {
            return -1;
        }
        //邮箱是否存在？
        example = new UserExample();
        criteria = example.createCriteria();
        criteria.andEmailEqualTo(signUpDTO.getEmail());
        users = userMapper.selectByExample(example);
        if (users != null && users.size() > 0) {
            return -2;
        }
        //用户名是否存在？
        example = new UserExample();
        criteria = example.createCriteria();
        criteria.andUsernameEqualTo(signUpDTO.getUsername());
        users = userMapper.selectByExample(example);
        if (users != null && users.size() > 0) {
            return -3;
        }

        return userMapper.insertSelective(user);
    }

    @Override
    public int selectInfo(String info, Integer type) {
        UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        if (type == 1) {
            //用户名
            criteria.andUsernameEqualTo(info);
        } else if (type == 2) {
            //手机号
            criteria.andTelephoneEqualTo(info);
        } else {
            //电子邮件
            criteria.andEmailEqualTo(info);
        }
        List<User> users = userMapper.selectByExample(example);
        if (users != null && users.size() > 0) {
            return 1;
        }
        return 0;
    }

    @Override
    public User oneKeySignIn(String phone) {
        //判断手机号是否注册过，注册过直接校验验证码登录，没注册过需要进行对用户信息进行填充
        UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        criteria.andTelephoneEqualTo(phone);
        List<User> users = userMapper.selectByExample(example);
        if (users != null && users.size() > 0) {
            User user = users.get(0);
            return user;
        } else {
            //2、查不到就创建一个用户返回
            //创建一个user对象
            User user = new User();
            //设置信息
            user.setTelephone(phone);
            //自动生成昵称的功能
            user.setNickname(userDao.randomNickName());
            //插入数据库
            userMapper.insertSelective(user);
            //查询出来
            users = userMapper.selectByExample(example);
            //返回
            return users.get(0);
        }
    }

    @Override
    public User searchUserById(Long userId) {
        return userMapper.selectByPrimaryKey(userId);
    }

    @Override
    public List<UserVO> searchUserByIds(List<Long> userIds) {
        return userDao.findUsersByIds(userIds);
    }

    @Override
    public int updateIconLinkById(Long userId, String iconLink) {
        //新建一个user对象
        User user = new User();
        //设置主键数据，作为更新数据的判断条件
        user.setId(userId);
        //设置头像地址信息，作为更新的数据
        user.setIconLink(iconLink);
        //根据主键更新其它非空成员（数据库字段）
        int result = userMapper.updateByPrimaryKeySelective(user);
        //返回数据库的操作结果
        return result;
    }
}
